package com.hmall.api.config;

import com.hmall.api.client.fallback.ItemClientFallback;
import com.hmall.common.utils.UserContext;
import feign.Logger;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;

public class DefaultFeignConfig {
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.FULL;
    }
    /**
     * 创建并注册一个请求拦截器Bean，用于在Feign发起请求时自动添加当前登录用户信息到请求头
     *
     * @return RequestInterceptor Feign请求拦截器实例，负责处理请求头添加逻辑
     */
    @Bean
    public RequestInterceptor userInfoRequestInterceptor() {
        // 返回一个匿名内部类实现的RequestInterceptor
        return new RequestInterceptor() {
            /**
             * 拦截Feign请求，在请求发送前向请求模板中添加用户信息头
             *
             * @param template 请求模板对象，用于修改请求信息（如添加请求头）
             */
            @Override
            public void apply(RequestTemplate template) {
                // 从用户上下文（UserContext）中获取当前登录用户的ID
                // UserContext通常是一个ThreadLocal容器，用于存储当前线程的用户信息
                Long userId = UserContext.getUser();

                // 如果用户ID为空（表示当前请求未登录或不需要用户信息），则直接返回，不添加请求头
                if (userId == null) {
                    return;
                }

                // 如果用户ID不为空，将用户ID转换为字符串后添加到请求头"user-info"中
                // 下游微服务可以通过读取该请求头获取调用方传递的用户信息，实现用户上下文的传递
                template.header("user-info", userId.toString());
            }
        };
    }

    @Bean
    public ItemClientFallback itemClientFallback() {
        return new ItemClientFallback();
    }
}